<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html dir="ltr" xml:lang="es" xmlns="http://www.w3.org/1999/xhtml" lang="es"><head>

	
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<meta name="keywords" content="Capítulo 2.- ¡Esta vivo! ¡vivoooooo! ¡JAJAJA!,Capítulo 1.- ¡Mama! ¡Mama! mira lo que hago...,Capítulo 3: ¡Qué aburrido! yo quiero interactuar,Nuestra primera interfaz gráfica con CodeBlocks y wxWidgets">
<link rel="shortcut icon" href="http://doc.ubuntu-es.org/favicon.ico">
<link rel="search" type="application/opensearchdescription+xml" href="http://doc.ubuntu-es.org/opensearch_desc.php" title="doc.ubuntu-es (Español)">
<link title="Creative Commons" type="application/rdf+xml" href="http://doc.ubuntu-es.org/index.php?title=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;action=creativecommons" rel="meta">
<link rel="copyright" href="http://creativecommons.org/licenses/by-sa/3.0/">
		<title>Capítulo 2.- ¡Esta vivo! ¡vivoooooo! ¡JAJAJA! - doc.ubuntu-es</title>
		<style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "/skins/monobook/main.css?42b"; /*]]>*/</style>
		<link rel="stylesheet" type="text/css" media="print" href="Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21_archivos/commonPrint.css">
		<link rel="stylesheet" type="text/css" media="handheld" href="Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21_archivos/handheld.css">
		<!--[if lt IE 5.5000]><style type="text/css">@import "/skins/monobook/IE50Fixes.css?42b";</style><![endif]-->
		<!--[if IE 5.5000]><style type="text/css">@import "/skins/monobook/IE55Fixes.css?42b";</style><![endif]-->
		<!--[if IE 6]><style type="text/css">@import "/skins/monobook/IE60Fixes.css?42b";</style><![endif]-->
		<!--[if IE 7]><style type="text/css">@import "/skins/monobook/IE70Fixes.css?42b";</style><![endif]-->
		<!--[if lt IE 7]><script type="text/javascript" src="/skins/common/IEFixes.js?42b"></script>
		<meta http-equiv="imagetoolbar" content="no" /><![endif]-->
		
		<script type="text/javascript">/*<![CDATA[*/
var skin = "monobook";
var stylepath = "/skins";
var wgArticlePath = "/$1";
var wgScriptPath = "";
var wgServer = "http://doc.ubuntu-es.org";
var wgCanonicalNamespace = "";
var wgCanonicalSpecialPageName = false;
var wgNamespaceNumber = 0;
var wgPageName = "Capítulo_2.-_¡Esta_vivo!_¡vivoooooo!_¡JAJAJA!";
var wgTitle = "Capítulo 2.- ¡Esta vivo! ¡vivoooooo! ¡JAJAJA!";
var wgArticleId = "1868";
var wgIsArticle = true;
var wgUserName = null;
var wgUserLanguage = "es";
var wgContentLanguage = "es";
var wgBreakFrames = false;
var wgCurRevisionId = "10559";
/*]]>*/</script>
                
		<script type="text/javascript" src="Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21_archivos/wikibits.js"><!-- wikibits js --></script>
		<script type="text/javascript" src="Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21_archivos/index.php"><!-- site js --></script>
		<style type="text/css">/*<![CDATA[*/
@import "/index.php?title=MediaWiki:Common.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
@import "/index.php?title=MediaWiki:Monobook.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
@import "/index.php?title=-&action=raw&gen=css&maxage=18000";
/*]]>*/</style>
		<!-- Head Scripts -->
		<script type="text/javascript" src="Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21_archivos/ajax.js"></script>
<script src="Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21_archivos/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-3100124-1";
urchinTracker();
</script>
	</head><body class="mediawiki ns-0 ltr page-Capítulo_2_-_¡Esta_vivo_¡vivoooooo_¡JAJAJA">
	<div id="globalWrapper">
		<div id="column-content">
	<div id="content">
		<a name="top" id="top"></a>
				<h1 class="firstHeading">Capítulo 2.- ¡Esta vivo! ¡vivoooooo! ¡JAJAJA!</h1>
		<div id="bodyContent">
			<h3 id="siteSub">De doc.ubuntu-es</h3>
			<div id="contentSub"></div>
									<div id="jump-to-nav">Saltar a <a href="#column-one">navegación</a>, <a href="#searchInput">búsqueda</a></div>			<!-- start content -->
			<table id="toc" class="toc" summary="Tabla de contenidos"><tbody><tr><td><div id="toctitle"><h2>Tabla de contenidos</h2> <span class="toctoggle">[<a href="javascript:toggleToc()" class="internal" id="togglelink">esconder</a>]</span></div>
<ul>
<li class="toclevel-1"><a href="#Introducci.C3.B3n"><span class="tocnumber">1</span> <span class="toctext">Introducción</span></a></li>
<li class="toclevel-1"><a href="#Creaci.C3.B3n_de_nuestra_primera_ventana"><span class="tocnumber">2</span> <span class="toctext">Creación de nuestra primera ventana</span></a>
<ul>
<li class="toclevel-2"><a href="#Breves_anotaciones_sobre_la_documentacion:"><span class="tocnumber">2.1</span> <span class="toctext">Breves anotaciones sobre la documentacion:</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="#Introducci.C3.B3n_de_una_barra_de_men.C3.BAs"><span class="tocnumber">3</span> <span class="toctext">Introducción de una barra de menús</span></a></li>
</ul>
</td></tr></tbody></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "mostrar"; var tocHideText = "esconder"; showTocToggle(); } </script>
<a name="Introducci.C3.B3n"></a><h2><span class="editsection">[<a href="http://doc.ubuntu-es.org/index.php?title=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;action=edit&amp;section=1" title="Editar sección: Introducción">editar</a>]</span> <span class="mw-headline"> Introducción </span></h2>
<p>En este capítulo vamos a aprender a crear una ventana, y con ello
empezaremos a trazar un protocolo sobre la creación de diálogos y
"canvas", que iremos puliendo en los siguientes capítulos.
</p>
<a name="Creaci.C3.B3n_de_nuestra_primera_ventana"></a><h2><span class="editsection">[<a href="http://doc.ubuntu-es.org/index.php?title=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;action=edit&amp;section=2" title="Editar sección: Creación de nuestra primera ventana">editar</a>]</span> <span class="mw-headline"> Creación de nuestra primera ventana </span></h2>
<p>El primer paso sera recuperar el trabajo donde lo dejamos, esto se
puede hacer de dos formas, abriendo code::blocks, el cual nos mostrará
los proyectos más recientes, o directamente desde la carpeta
/home/user/proyectos_codeblocks/learn_0.01, haciendo dobleclick sobre
learn_0.01.cbp.
</p>
<ul><li> Es una buena política, aunque en nuestro caso innecesaria,
pues sólo estamos jugueteando, cada vez que vayamos a cambiar algo,
crear una nueva versión, es decir, duplicar la carpeta
/home/user/proyectos_codeblocks/learn_0.01 en
/home/user/proyectos_codeblocks/learn_0.02.
</li></ul>
<p>Realmente, la forma más purista sería crear un nuevo proyecto,
copiar todos los fuentes y los headers del antiguo, e importarlos, pero
eso sólo cuando vayamos a lanzar una versión de verdad.
</p><p>Pero sigamos a lo nuestro... Una vez recuperado nuestro trabajo, sin duda ninguna tendremos que trazarnos un plan de trabajo:
</p>
<ul><li> Plan de trabajo del capítulo 2: <br>En este capítulo nos
conformaremos con poco, simplemente crearemos una ventana con el título
"Welcome to wxWidgets!" (como en los ejemplos de wxWidgets, nada
original), la cual tendrá una barra de menús con el menu file/exit. El
uso del menu lo dejaremos para un capítulo posterior, que no es bueno
forzar...
</li></ul>
<p>Asi que al turrón, la ventana que vamos a insertar es un tanto
especial, y no es la que usaremos habitualmente, se trata de wxFrame
(en el resto de ocasiones usaremos wxDialog, y en su día entenderemos
la diferencia, aunque podeís encontrarla en la documentación). Así que
lo primerísimo que tenemos que hacer es tener bien presente la
información necesaria sobre wxFrame, por lo tanto abrimos nuestro
wx.chm (preludio de este capítulo), y en la pestaña índice buscamos
wxFrame.
</p>
<a name="Breves_anotaciones_sobre_la_documentacion:"></a><h3><span class="editsection">[<a href="http://doc.ubuntu-es.org/index.php?title=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;action=edit&amp;section=3" title="Editar sección: Breves anotaciones sobre la documentacion:">editar</a>]</span> <span class="mw-headline"> Breves anotaciones sobre la documentacion: </span></h3>
<p>Siempre que busquemos cualquier elemento, nos apareceran en este orden las siguientes cosas:<br>
</p>
<ul><li> Una breve descripcion del elemento
</li><li> Los includes que son necesarios. Muchas veces, estos includes
ya estan llamados por otros, asi que os recomiendo no incluirlos a
menos que recibais un error en la compilacion que os diga que no esta
declarado.
</li><li> Los macros de los estilos, si los tiene (ya hablaremos de ellos, espero...)
</li><li> Los eventos que maneja (Tambien hablaremos de ellos, seguro)
</li><li> Anotaciones
</li><li> Temas relacionados
</li><li> Funciones miembro, de las cuales la primera, y mas importante, siempre sera el constructor
</li></ul>
<p><br>
</p><p>Bueno, Ahora que ya tenemos localizado el elemento a introducir,
aparquemos momentaneamente esa información, ya que antes debemos darle
un nombre, ¡"TopFrame" será una buena alternativa!
</p><p>Asi que por dicho, vamos a crear nuestra clase, para ello vamos
a Code::Blocks y creamos dos archivos, "topframe.cpp" y "topframe.h".
(Por supuesto, todo lo que se encuentre en un tutorial anterior no se
repite)
</p><p>Como es lógico, empezaremos por la cabecera, asi que abrimos
"topframe.h", y borramos la morralla que nos haya creado (dejándolo), y
creamos nuestra clase:
</p>
<pre>class TopFrame&nbsp;: public wxFrame
{
};
</pre>
<p>Efectivamente, declaramos una clase llamada TopFrame, que hereda
todas las propiedades de wxFrame. Ahora nos disponemos a crear el
constructor, éste constructor debe recibir todos los parametros que
pudieran ser necesarios para wxFrame, asi que recuperamos nuestra
documentación, y buscamos el constructor de wxFrame (<b>wxFrame::wxFrame</b>).
Solo tiene un posible constructor, así que no hay mucho donde elegir
(para los que el tema de las clases no les sea familiar, simplemente,
que no se estressen, lo irán entendiendo poco a poco), así que
analizemos los parametros que debe recibir:
</p>
<ul><li> wxWindow* parent: Se tratará del elemento que la crea, o que
la contiene, en este caso ninguno, pues para algo es nuestra TopFrame
(no dependerá ni de nada nji de nadie). Así que este parametro no habrá
de recibirlo (en TopFrame, clar esta, y si no lo está, lo va a estar
enseguida), pues siempre será NULL.
</li><li> wxWindowID id: De momento no vamos a introducir la utilidad
de los id, simplemente decir que cuando no nos interesa tenerlo (como
es el caso), ponemos wxID_ANY. Así que este tampoco será un parametro a
solicitar.
</li><li> const wxString&amp; title: Será el título de nuestra
ventana. A partir de ahora, salvo casos excepcionales, wxString serán
nuestras cadenas de texto por defecto (podeís ir buscando un poco de
información, pero las vamos a trillar tanto que las conocereis como a
vuestras hijas). Aunque en un principio este valor también lo
conocemos, lo meteremos como parámetro, por tener alguno...
</li><li> Parámetros con valor por defecto: Los siguientes parámetros,
ya tienen un valor por defecto, y por ahora para nosotros, ese valor
estará bien (si acaso os sentís con ánimo, jugar un poco a ver si
conseguis tocotear)
<ul><li> Posición: (en wxWidgets, las posiciones siempre se cuentan
desde la esquina superior izquierda, es decir, esta sería la posición
de la esquina superior izquierda de la ventana respecto de la esquina
superior izquierda de la pantalla). Se podría introducir por ejemplo
como wxPoint(15,15), lo que la situaría en el pixel 15,15.
</li><li> Tamaño: Medido en pixeles, se podría meter como
wxSize(100,100), lo que haría que la ventana tuviera un tamaño de
100x100 pixels
</li><li> Estilo: Sería activar los macros que te gusten, para mezclar
macros se hace con el simbolo "|", por ejemplo: wxMINIMIZE_BOX |
wxMAXIMIZE_BOX | wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION |
wxCLOSE_BOX | wxCLIP_CHILDREN.
</li><li> Nombre: Se usan para la ayuda, nosotros no llegaremos a usarlo, pero esta bien saberlo.
</li></ul>
</li></ul>
<p>Así que nada, ya lo tenemos clarísimo, nuestra wxFrame tan sólo
solicita de TopFrame el título de la ventana, y como nuestro TopFrame
no requiere datos adicionales (de momento), este será el único
parámetro que solicitará, así que añadamos nuestro constructor a la
clase:
</p><p><br>
</p>
<pre> class TopFrame&nbsp;: public wxFrame
 {
 <b>public:
     TopFrame(wxString Title);</b>
 };
</pre>
<p><br>
El constructor siempre será una clase pública, pues se tiene que poder acceder a él.
</p>
<ul><li> <i>Respecto de public:</i>
<ul><li> Public: Todo el código puede acceder a él.
</li><li> Protected: Sólo la propia clase, y sus heredadas pueden acceder a él.
</li><li> Private: Sólo la propia clase puede acceder a él.
</li></ul>
</li></ul>
<p>De momento nuestro TopFrame no tendrá nada más, así que cambiémonos
a "topframe.cpp" para implementar el constructor. Evidentemente, lo
primero que querremos en "topframe.cpp" serán las cabeceras (las
estandar de C, las de wxWidgets, y la cabecera que acabamos de crear),
así que nuestras primeras lineas serán:
</p>
<pre>#include &lt;math.h&gt;
#include &lt;stdio.h&gt;
#include &lt;wx/wx.h&gt;
#include &lt;wx/string.h&gt;
#include "topframe.h"
</pre>
<p>Fijaos que he añadido la libreria wx/string.h, probar a no añadirla, vereís que pronto os dice que wxString no esta definida.
</p><p>Y ahora a implementar el constructor, así que nuestras siguientes líneas serán:
</p>
<pre>TopFrame::TopFrame(wxString Title)
{
    
}
</pre>
<p>Donde efectivamente creamos el constructor de TopFrame, que debe
recibir el parámetro Title, de tipo wxString, pero hace falta
implementarle la clase heredada, así que a continuación, o debajo (como
hago yo) introducimos la siguiente línea:
</p>
<pre> TopFrame::TopFrame(wxString Title)
 <b>: wxFrame(NULL, wxID_ANY, Title)</b>
 {
     
 }
</pre>
<p>Donde a wxFrame, como parent, le pasamos NULL, como id le pasamos
wxID_ANY, y como título le pasamos el título que ha recibido TopFrame,
llamado Title. ¿Empezais a verle el truquillo?
</p><p>Claro, eso requiere que cada vez que haya que llamar a TopFrame
(en este caso no hay problema, pues sólo lo haremos una vez) haya que
pasarle el título, pero ¿no sería mas lógico que ya tuviera un título
preasignado? Pues sí, lo sería, así que volvamos a "topframe.h", y
cambiemos ligeramente el constructor:
</p>
<pre> class TopFrame&nbsp;: public wxFrame
 {
 public:
     TopFrame(wxString Title<b> = _T("Welcome to wxWidgets") </b>);
 };
</pre>
<p>De esta forma, en caso de omisión de este parámetro, asumirá que queríamos pasarle _T("Welcome to wxWidgets").
</p>
<ul><li> <i>Respecto de _T("Welcome to wxWidgets")...</i>
<ul><li> _() Es un wxString que establece que el texto incluido dentro
se lee como tal, es decir, no interpreta los \n, ni los \t, ni los %d,
ni nada por el estilo.
</li><li> _T() Es un wxString que establece que el texto incluido
dentro se lee como tal, pero interpreta los \n, y los \t, aunque no los
%d, ni nada por el estilo.
</li><li> wxT() Es un wxString que realiza interpretaciones, como por ejemplo de los \n, de los \t, de los %d etc...
</li></ul>
</li></ul>
<p><b>Esta última línea puede no ser correcta, os recomiendo buscar en la documentación</b>
</p><p>Bueno, ya tenemos la clase completa, vamos a llamarala desde
nuestro main, así que abrimos "main.cpp", y una vez allí lo primero que
necesitaremos serán las nuevas cabeceras (la de wxString y la de
Topframe), así que los includes ahora quedarán así:
</p>
<pre>#include &lt;math.h&gt;
#include &lt;stdio.h&gt;
#include &lt;wx/wx.h&gt;
#include &lt;wx/string.h&gt;
#include "topframe.h"
#include "main.h"
</pre>
<ul><li> ¡CUIDADO!: Parece una chorrada, pero el orden es importante,
si hubiéramos incluido antes "main.h", no podriamos declarar dentro de
"main.h" nada referente a TopFrame. En este caso no será importante,
pero más tarde si lo será.
</li></ul>
<p>En fin, continuemos... El siguiente paso lógico es declarar una
TopFrame para nuestro programa, así que añadimos la siguiente línea al
código:
</p>
<pre> IMPLEMENT_APP(SampleApp)
</pre>
<pre> bool SampleApp::OnInit()
 {
     <b>TopFrame *frame;</b>
     return true; //true == run the app
     //no delete!!! it's implement in destroy();
 }
</pre>
<p>Vereís que jugamos muchas veces con la declaración de los tipos:
TopFrame *frame;
TopFrame frame;
</p><p>La más interesante es la primera, pero requiere más operaciones, así que cuando podamos optaremos por la segunda.
</p><p>El siguiente paso es llamar al constructor:
</p>
<pre> IMPLEMENT_APP(SampleApp)
 
 bool SampleApp::OnInit()
 {
     TopFrame *frame;
     <b>//frame = new TopFrame();</b>
     <b>frame = new TopFrame(_T("Welcome to wxWidgets!"));</b>
     return true; //true == run the app
     //no delete!!! it's implement in destroy();
 }
</pre>
<p>Como puedes ver pongo dos constructores diferentes, uno de ellos
comentado, si descomentas el primero, y comentas el segundo (cuando
hayamos acabado) verás que el título de la ventana pasa de ser "Welcome
to wxWidgets!" a ser "Welcome to wxWidgets", que era el que pusimos por
defecto.
</p><p>Bueno, si probaras a compilar ahora, y a ejecutar, el código
haría lo mismo que antes, solo que encima ahora nunca se cerraría, y
habría que cerrarlo o por Code::Blocks, o por el administrador de
procesos. Así que falta una orden para que nos muestre la ventana, como
ya hemos dicho, wxFrame es una clase un poquito especial, así que
quedaos con que la siguiente orden funciona, aunque no la veais en su
documentación, porque la tiene heredada.
</p>
<pre> IMPLEMENT_APP(SampleApp)
 
 bool SampleApp::OnInit()
 {
     TopFrame *frame;
     //frame = new TopFrame();
     frame = new TopFrame(_T("Welcome to wxWidgets!"));
     <b>frame-&gt;Show(true);	//show the frame of application</b>
     return true; //true == run the app
     //no delete!!! it's implement in destroy();
 }
</pre>
<p>Y por último, por juguetear un poco, vamos a maximizar:
</p>
<pre> IMPLEMENT_APP(SampleApp)
</pre>
<pre> bool SampleApp::OnInit()
 {
     TopFrame *frame;
     //frame = new TopFrame();
     frame = new TopFrame(_T("Welcome to wxWidgets!"));
     frame-&gt;Show(true);	//show the frame of application
     <b>frame-&gt;Maximize();	//maximize the frame of application</b>
     return true; //true == run the app
     //no delete!!! it's implement in destroy();
 }
</pre>
<p>Prueba a compilar y a ejecutar, y a ver que ocurre... <b>¡¡¡Éxito!!!</b> Aquí tenemos nuestra ventana maximizada dándonos la bienvenida.
</p>
<a name="Introducci.C3.B3n_de_una_barra_de_men.C3.BAs"></a><h2><span class="editsection">[<a href="http://doc.ubuntu-es.org/index.php?title=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;action=edit&amp;section=4" title="Editar sección: Introducción de una barra de menús">editar</a>]</span> <span class="mw-headline"> Introducción de una barra de menús </span></h2>
<p>Para poner la guinda al pastel, vamos a añadir la barra de menús, que nos servirá en el próximo capítulo...
</p><p>Para ello vamos hasta el constructor de TopFrame en
"topframe.cpp", y añadimos las siguientes órdenes...**Recordar, toda
esta informacion la teneis en la documentación**
</p>
<ol><li> Creamos un elemento menú:
</li></ol>
<pre>     TopFrame::TopFrame(wxString Title)
    &nbsp;: wxFrame(NULL, wxID_ANY, Title)
     {
     	<b>//creamos un menu muy simple</b>
     	<b>wxMenu *fileMenu = new wxMenu;</b>
     }
</pre>
<ol><li> Le añadimos el comando "Exit Alt+F4"
</li></ol>
<pre>     TopFrame::TopFrame(wxString Title)
    &nbsp;: wxFrame(NULL, wxID_ANY, Title)
     {
     	//creamos un menu muy simple
     	wxMenu *fileMenu = new wxMenu;
     	<b>fileMenu-&gt;Append(wxID_EXIT, _T("&amp;Exit\tAlt-F4"), _T("Termina el programa"));</b>
     }
</pre>
<p>wxID_EXIT es un ID que ya conoce wxWidgets, normalmente tendremos
que crear nosotros nuestros ID, que lo haremos en el siguiente
capítulo...
</p>
<ol><li> Declaramos y creamos la menubar
</li></ol>
<pre>     TopFrame::TopFrame(wxString Title)
    &nbsp;: wxFrame(NULL, wxID_ANY, Title)
     {
     	//creamos un menu muy simple
     	wxMenu *fileMenu = new wxMenu;
     	fileMenu-&gt;Append(wxID_EXIT, _T("&amp;Exit\tAlt-F4"), _T("Termina el programa"));
     	<b>wxMenuBar *menuBar = new wxMenuBar();</b>
     }
</pre>
<p>Esta es otra forma muy típica de actuár, realizar la declaración y la construcción en la misma línea.
</p>
<ol><li> Añadimos el elemento menu, y le seteamos a Topframe la menubar
</li></ol>
<pre>     TopFrame::TopFrame(wxString Title)
    &nbsp;: wxFrame(NULL, wxID_ANY, Title)
     {
     	//creamos un menu muy simple
     	wxMenu *fileMenu = new wxMenu;
     	fileMenu-&gt;Append(wxID_EXIT, _T("&amp;Exit\tAlt-F4"), _T("Termina el programa"));
     	wxMenuBar *menuBar = new wxMenuBar();
     	<b>menuBar-&gt;Append(fileMenu, _T("&amp;File"));</b>
     	<b>SetMenuBar(menuBar);</b>
     }
</pre>
<p>Finalmente nuestros archivos quedan de la forma:
</p><p>main.h:
</p>
<pre>class SampleApp&nbsp;: public wxApp
{
public:
	virtual bool OnInit();
};
</pre>
<p>main.cpp:
</p>
<pre>#include &lt;math.h&gt;
#include &lt;stdio.h&gt;
#include &lt;wx/wx.h&gt;
#include &lt;wx/string.h&gt;
#include "topframe.h"
#include "main.h"

/**********************************************************************/
/************** This function run the application         *************/
/************** can force some parameters too (p.ej size) *************/
/**********************************************************************/

IMPLEMENT_APP(SampleApp)

bool SampleApp::OnInit()
{
    TopFrame *frame;
    //frame = new TopFrame();
    frame = new TopFrame(_T("Welcome to wxWidgets!"));
    frame-&gt;Show(true);	//show the frame of application
    frame-&gt;Maximize();	//maximize the frame of application
    return true; //true == run the app
    //no delete!!! it's implement in destroy();
}

topframe.h:

class TopFrame&nbsp;: public wxFrame
{
public:
    TopFrame(wxString Title = _T("Welcome to wxWidgets"));
};
</pre>
<p>topframe.cpp:
</p>
<pre>#include &lt;math.h&gt;
#include &lt;stdio.h&gt;
#include &lt;wx/wx.h&gt;
#include &lt;wx/string.h&gt;
#include "topframe.h"

TopFrame::TopFrame(wxString Title)
: wxFrame(NULL, wxID_ANY, Title)
{
	//creamos un menu muy simple
	wxMenu *fileMenu = new wxMenu;
	fileMenu-&gt;Append(wxID_EXIT, _T("&amp;Exit\tAlt-F4"), _T("Termina el programa"));
	wxMenuBar *menuBar = new wxMenuBar();
	menuBar-&gt;Append(fileMenu, _T("&amp;File"));
	SetMenuBar(menuBar);
}
</pre>
<p>Compila y ejecuta... Verás que ha aparecido el menú, pero que no
hace nada, así que... ¿Qué toca hacer ahora? Efectivamente, ¡empezar a
manejarlo!
Pero eso será en el siguiente capítulo...
</p><p><br>
</p>
<table class="wikitable" align="center" border="1">

<tbody><tr>
<td style="border: 2px solid rgb(139, 103, 58); padding: 5px; text-align: center; background-color: rgb(240, 226, 198); -moz-border-radius-topleft: 8px; -moz-border-radius-topright: 8px; -moz-border-radius-bottomright: 8px; -moz-border-radius-bottomleft: 8px; font-weight: bold;"> <a href="http://doc.ubuntu-es.org/Cap%C3%ADtulo_1.-_%C2%A1Mama%21_%C2%A1Mama%21_mira_lo_que_hago..." title="Capítulo 1.- ¡Mama! ¡Mama! mira lo que hago...">Capítulo 1.- ¡Mama! ¡Mama! mira lo que hago...</a>
</td><td style="border: 2px solid rgb(139, 103, 58); padding: 5px; text-align: center; background-color: rgb(240, 226, 198); -moz-border-radius-topleft: 8px; -moz-border-radius-topright: 8px; -moz-border-radius-bottomright: 8px; -moz-border-radius-bottomleft: 8px; font-weight: bold;"> <a href="http://doc.ubuntu-es.org/Nuestra_primera_interfaz_gr%C3%A1fica_con_CodeBlocks_y_wxWidgets" title="Nuestra primera interfaz gráfica con CodeBlocks y wxWidgets">Nuestra primera interfaz gráfica con CodeBlocks y wxWidgets</a>
</td><td style="border: 2px solid rgb(139, 103, 58); padding: 5px; text-align: center; background-color: rgb(240, 226, 198); -moz-border-radius-topleft: 8px; -moz-border-radius-topright: 8px; -moz-border-radius-bottomright: 8px; -moz-border-radius-bottomleft: 8px; font-weight: bold;"> <a href="http://doc.ubuntu-es.org/Cap%C3%ADtulo_3:_%C2%A1Qu%C3%A9_aburrido%21_yo_quiero_interactuar" title="Capítulo 3: ¡Qué aburrido! yo quiero interactuar">Capítulo 3: ¡Qué aburrido! yo quiero interactuar</a>
</td></tr></tbody></table>

<!-- Saved in parser cache with key doc_u-es:pcache:idhash:1868-0!1!0!!es!2 and timestamp 20100214183859 -->
<div class="printfooter">
Obtenido de "<a href="http://doc.ubuntu-es.org/Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21">http://doc.ubuntu-es.org/Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21</a>"</div>
			<div id="catlinks"><p class="catlinks"><a href="http://doc.ubuntu-es.org/Especial:Categories" title="Especial:Categories">Categoría</a>: <span dir="ltr"><a href="http://doc.ubuntu-es.org/Categor%C3%ADa:Programaci%C3%B3n" title="Categoría:Programación">Programación</a></span></p></div>			<!-- end content -->
			<div class="visualClear"></div>
		</div>
	</div>
		</div>
		<div id="column-one">
	<div id="p-cactions" class="portlet">
		<h5>Vistas</h5>
		<div class="pBody">
			<ul>
						 <li id="ca-nstab-main" class="selected"><a title="Ver el artículo [alt-c]" accesskey="c" href="http://doc.ubuntu-es.org/Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21">Artículo</a></li>
						 <li id="ca-talk" class="new"><a title="Discusión acerca del artículo [alt-t]" accesskey="t" href="http://doc.ubuntu-es.org/index.php?title=Discusi%C3%B3n:Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;action=edit">Discusión</a></li>
						 <li id="ca-edit"><a title="Puedes editar esta página. Por favor, usa el botón de previsualización antes de grabar. [alt-e]" accesskey="e" href="http://doc.ubuntu-es.org/index.php?title=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;action=edit">Editar</a></li>
						 <li id="ca-history"><a title="Versiones anteriores de esta página y sus autores [alt-h]" accesskey="h" href="http://doc.ubuntu-es.org/index.php?title=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;action=history">Historial</a></li>
				</ul>
		</div>
	</div>
	<div class="portlet" id="p-personal">
		<h5>Herramientas personales</h5>
		<div class="pBody">
			<ul>
				<li id="pt-login"><a title="Te animamos a registrarte, aunque no es obligatorio [alt-o]" accesskey="o" href="http://doc.ubuntu-es.org/index.php?title=Especial:Userlogin&amp;returnto=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21">Registrarse/Entrar</a></li>
			</ul>
		</div>
	</div>
	<div title="Portada" class="portlet" id="p-logo">
		<a style="background-image: url(/skins/common/images/wiki.png);" href="http://doc.ubuntu-es.org/Documentaci%C3%B3n" title="Documentación"></a>
	</div>
	<script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
		<div class="portlet" id="p-navigation">
		<h5>Navegación</h5>
		<div class="pBody">
			<ul>
				<li id="n-mainpage"><a title="Visitar la Portada [alt-z]" accesskey="z" href="http://doc.ubuntu-es.org/Documentaci%C3%B3n">Documentación</a></li>
				<li title="Acerca del proyecto, qué puedes hacer, dónde encontrar información" id="n-portal"><a href="http://doc.ubuntu-es.org/doc.ubuntu-es:Portal_de_la_comunidad">Portal de la comunidad</a></li>
				<li title="Información de contexto sobre acontecimientos actuales" id="n-currentevents"><a href="http://doc.ubuntu-es.org/Proyectos">Proyectos</a></li>
				<li id="n-recentchanges"><a title="La lista de cambios recientes en el wiki [alt-r]" accesskey="r" href="http://doc.ubuntu-es.org/Especial:Recentchanges">Cambios recientes</a></li>
				<li id="n-randompage"><a title="Cargar una página aleatoriamente [alt-x]" accesskey="x" href="http://doc.ubuntu-es.org/Especial:Random">Página aleatoria</a></li>
				<li title="El lugar para aprender" id="n-help"><a href="http://doc.ubuntu-es.org/doc.ubuntu-es:Ayuda">Ayuda</a></li>
				<li title="Respáldanos" id="n-sitesupport"><a href="http://doc.ubuntu-es.org/doc.ubuntu-es:Tareas">Tareas</a></li>
			</ul>
		</div>
	</div>
		<div id="p-search" class="portlet">
		<h5><label for="searchInput">Buscar</label></h5>
		<div id="searchBody" class="pBody">
			<form action="/Especial:Search" id="searchform"><div>
				<input id="searchInput" name="search" accesskey="f" type="text">
				<input name="go" class="searchButton" id="searchGoButton" value="Ir" type="submit">&nbsp;
				<input name="fulltext" class="searchButton" id="mw-searchButton" value="Buscar" type="submit">
			</div></form>
		</div>
	</div>
	<div class="portlet" id="p-tb">
		<h5>Herramientas</h5>
		<div class="pBody">
			<ul>
				<li id="t-whatlinkshere"><a title="Lista de todas las páginas del wiki que enlazan con ésta [alt-j]" accesskey="j" href="http://doc.ubuntu-es.org/Especial:Whatlinkshere/Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21">Lo que enlaza aquí</a></li>
				<li id="t-recentchangeslinked"><a title="Cambios recientes en las páginas que enlazan con esta otra [alt-k]" accesskey="k" href="http://doc.ubuntu-es.org/Especial:Recentchangeslinked/Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21">Seguimiento de enlaces</a></li>
<li id="t-upload"><a title="Subir imágenes o archivos multimedia [alt-u]" accesskey="u" href="http://doc.ubuntu-es.org/Especial:Upload">Subir archivo</a></li>
<li id="t-specialpages"><a title="Lista de todas las páginas especiales [alt-q]" accesskey="q" href="http://doc.ubuntu-es.org/Especial:Specialpages">Páginas especiales</a></li>
				<li id="t-print"><a href="http://doc.ubuntu-es.org/index.php?title=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;printable=yes">Versión para imprimir</a></li>				<li id="t-permalink"><a href="http://doc.ubuntu-es.org/index.php?title=Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21&amp;oldid=10559">Enlace permanente</a></li>			</ul>
		</div>
	</div>
		</div><!-- end of the left (by default at least) column -->
			<div class="visualClear"></div>
			<div id="footer">
				<div id="f-poweredbyico"><a href="http://www.mediawiki.org/"><img src="Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21_archivos/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki"></a></div>
				<div id="f-copyrightico"><a href="http://creativecommons.org/licenses/by-sa/3.0/"><img src="Cap%C3%ADtulo_2.-_%C2%A1Esta_vivo%21_%C2%A1vivoooooo%21_%C2%A1JAJAJA%21_archivos/88x31.png" alt="Atribución-Licenciar Igual 3.0"></a></div>
			<ul id="f-list">
				<li id="lastmod"> Esta página fue modificada por última vez el 18:26, 8 ago 2008.</li>
				<li id="viewcount">Esta página ha sido visitada 2.332 veces.</li>
				<li id="copyright">El contenido está disponible bajo los términos de la <i><a href="http://creativecommons.org/licenses/by-sa/3.0/" class="external " title="http://creativecommons.org/licenses/by-sa/3.0/" rel="nofollow">Atribución-Licenciar Igual 3.0</a></i></li>
				<li id="privacy"><a href="http://doc.ubuntu-es.org/doc.ubuntu-es:Pol%C3%ADtica_de_protecci%C3%B3n_de_datos" title="doc.ubuntu-es:Política de protección de datos">Política de protección de datos</a></li>
				<li id="about"><a href="http://doc.ubuntu-es.org/doc.ubuntu-es:Acerca_de" title="doc.ubuntu-es:Acerca de">Acerca de doc.ubuntu-es</a></li>
				<li id="disclaimer"><a href="http://doc.ubuntu-es.org/doc.ubuntu-es:Limitaci%C3%B3n_general_de_responsabilidad" title="doc.ubuntu-es:Limitación general de responsabilidad">Aviso legal</a></li>
			</ul>
		</div>
		
	
		<script type="text/javascript">if (window.runOnloadHook) runOnloadHook();</script>
</div>
<!-- Served by vaca in 0.435 secs. --></body></html>